package com.atguigu.config;

import com.atguigu.condition.LinuxCondition;
import com.atguigu.bean.Person;
import com.atguigu.condition.WindowsCondition;
import org.springframework.context.annotation.*;

/**
 * @author gcq
 * @Create 2020-09-22
 */
//配置类 == 配置文件
@Configuration // 告诉Spring这是配置类
// 没有符合条件一个都不会注册进组件
@Conditional({WindowsCondition.class})
@ComponentScans(value = {
        @ComponentScan(value = "com.atguigu",includeFilters = {
//                @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}),
//                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {BookService.class},
                @ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
        },useDefaultFilters = false)
})
// excludeFilters = Filter[] 指定扫描时候按照什么规则排除
// includeFilters = Filter[] 指定扫描的时候只需要包含那些组件
// FilterType.ANNOTATION 只按照注解
// ASSIGNABLE_TYPE 按照给定的类型
public class MainConfig {

  /*   给容器注册一个bean  类型为返回值，id默认是方法名作为id
     ConfigurableBeanFactory#SCOPE_PROTOTYPE
    	 * @see ConfigurableBeanFactory#SCOPE_SINGLETON
    	 * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
    	 * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
    	 * @see #value
     prototype 多实例
         ioc容器启动并不会去调用方法创建对象放在容器中
    每次获取的时候才会调用方法创建对象
     singleton单实例
            单实例默认值 ioc容器启动会调用方法创建对象放到ioc容器中
             以后每次获取就是直接从容器map.get()中拿
     request 同一次请求创建一个实例
     session 同一个session创建一个实例

     懒加载
        单实例bean 默认在容器启动的时候创建对象
        懒加载：启动容器不创建对象，第一次使用(获取)Bean创建对象，并初始化
    */
    @Scope()
    @Bean
    @Lazy
    public Person person() {
        System.out.println("从容器中拿到对象");
        return new Person("lisi",20);
    }
    /**
     * @Conditional({}) 按照一定的条件进行判断，满足条件给容器中注册bean
     * 系统widows 给容器中注册 bill
     * 系统linux 给容器注册 linus
     */
    @Conditional({WindowsCondition.class})
    @Bean("bill")
    public Person person01() {
        return new Person("bill Gates",62);
    }

    @Conditional({LinuxCondition.class})
    @Bean("linus")
    public Person person02() {
        return new Person("linus",48);
    }
    /**
     * 给容器注册组件
     * 1、包扫描+组件标准注解(@Controller/@Service/@Repository)
     */



}